/**
 * @param {array} postion 经纬度
 * @param {object} service { name , layerId} 地图文档名字 要素所在图层
 * @param {object} docLayer  地图文档图层
 * @param {array} attr 属性信息
 * [
 * {type:"string",name:"name",value:"警察局"},
 * {type:"int",name:"people",value:999}
 * ]
 */
const pointStyle = {
  Angle: 0, //
  Color: 3, //子图颜色（mapgis中的编号）
  Space: 0, //
  SymHeight: 12, //高
  SymID: 127, //子图号
  SymWidth: 12 //宽
}
class Point {
  // 添加
  static addPoint({ position, service, docLayer, attr }) {
    //1.创建一个点
    // 描述点形状的几何信息
    var gpoint = new Zondy.Object.GPoint(position[0], position[1]) //createPoint();
    //设置当前点要素的几何信息
    var fGeom = new Zondy.Object.FeatureGeometry({ PntGeom: [gpoint] })
    //描述点要素的样式信息
    var pointInfo = new Zondy.Object.CPointInfo(pointStyle)
    //设置当前点要素的图形参数信息
    var webGraphicInfo = new Zondy.Object.WebGraphicsInfo({
      InfoType: 1, //1 --点   2 --线  3 --区
      PntInfo: pointInfo
    })
    //设置添加点要素的属性信息
    var attValue = attr.map((item) => item.value)
    //创建一个要素
    var feature = new Zondy.Object.Feature({
      fGeom: fGeom,
      GraphicInfo: webGraphicInfo,
      AttValue: attValue
    })
    //设置要素为点要素
    feature.setFType(1) //1 --点   2 --线  3 --区

    //2. 创建一个要素数据集,添加要素
    var featureSet = new Zondy.Object.FeatureSet()
    featureSet.clear()
    //设置属性结构
    var cAttStruct = new Zondy.Object.CAttStruct({
      FldName: attr.map((item) => item.name),
      FldNumber: attValue.length,
      FldType: attr.map((item) => item.type)
    })
    featureSet.AttStruct = cAttStruct
    //添加要素到要素数据集
    featureSet.addFeature(feature)

    // 3.调用中地服务添加要素
    /**
     * 创建一个编辑服务类
     * 第一个参数是地图文档的名称
     * 第二个参数是添加的要素所在的图层
     */
    var editService = new Zondy.Service.EditDocFeature(service.name, service.layerId, {
      ip: 'localhost',
      port: '6163' //访问IGServer的端口号，.net版为6163，Java版为8089
    })
    //执行添加点要素功能
    editService.add(featureSet, Point.onPntSuccess(docLayer))
  }
  //添加点要素回调函数
  static onPntSuccess(docLayer) {
    return function (data) {
      if (data.succeed) {
        alert('添加点要素成功！')
        docLayer.refresh()
      } else {
        alert('添加点要素失败！')
      }
    }
  }
  // 查询
  static queryPoint({ position, service, callback }) {
    //1、创建一个用于查询的点形状
    var pointObj = new Zondy.Object.Point2D(position[0], position[1])
    //设置查询点的搜索半径
    pointObj.nearDis = 0.001
    //2、初始化查询结构对象，告诉服务端查询结果中应该包含哪些信息
    var queryStruct = new Zondy.Service.QueryFeatureStruct()
    //是否包含几何图形信息
    queryStruct.IncludeGeometry = true
    //是否包含属性信息
    queryStruct.IncludeAttribute = true
    //是否包含图形显示参数
    queryStruct.IncludeWebGraphic = true
    //3、创建查询规则
    var rule = new Zondy.Service.QueryFeatureRule({
      //是否将要素的可见性计算在内
      EnableDisplayCondition: false,
      //是否完全包含
      MustInside: false,
      //是否仅比较要素的外包矩形
      CompareRectOnly: false,
      //是否相交
      Intersect: true
    })
    //4、实例化查询参数对象
    var queryParam = new Zondy.Service.QueryParameter({
      geometry: pointObj,
      resultFormat: 'json',
      struct: queryStruct,
      rule: rule
    })
    //5、实例化地图文档查询服务对象
    var queryService = new Zondy.Service.QueryDocFeature(
      queryParam,
      service.name,
      service.layerId,
      {
        ip: 'localhost',
        port: '6163'
      }
    )
    queryService.query(Point.querySuccess(callback), Point.queryError)
  }
  //查询点要素失败回调函数
  static queryError(e) {
    console.log(e)
  }
  //查询点要素成功回调函数
  static querySuccess(callback) {
    return function (result) {
      //初始化Zondy.Format.PolygonJSON类
      var format = new Zondy.Format.PolygonJSON()
      //将MapGIS要素JSON反序列化 ol.Feature类型数组
      var features = format.read(result)
      callback(features)
    }
  }
}
export { Point }
